---
title: CR曲线
icon: Spline
---

## 说明

全称为：Cublic Catmull Rom Spline，一般项目里面简称CR曲线。CR曲线是唯一可以自带控制点的可调整曲线。

CR曲线在创建时默认没有手动控制点，因此看上去是一条直线，需要自行添加控制点才能成为曲线。

如果将松紧程度拉到最紧，形态会变成一条折线。

目前还在开发状态，交互还不完整。

## 属性

松紧程度：`tension`，控制曲线弯曲程度，取值范围为0~1，0表示线性，1表示圆滑。

其他参数：`alpha`，固定0.5不可调整，仅由开发人员调整。

## 原理

### 计算

CR曲线本质是一个参数方程，给定四个控制点 $\boldsymbol{p_0},\boldsymbol{p_1},\boldsymbol{p_2},\boldsymbol{p_3}$ 以及 $\alpha,\tau$ 通过如下方法计算：

$$
t_{01}=\lvert \boldsymbol{p_0}-\boldsymbol{p_1} \rvert ^\alpha \\
t_{12}=\lvert \boldsymbol{p_1}-\boldsymbol{p_2} \rvert ^\alpha \\
t_{23}=\lvert \boldsymbol{p_2}-\boldsymbol{p_3} \rvert ^\alpha
$$

$$
\boldsymbol{m_1}=(1-\tau)
    (\boldsymbol{p_2} - \boldsymbol{p_1} + t_{12} (
      \frac{\boldsymbol{p_1} - \boldsymbol{p_0}}{t_{01}} - \frac{\boldsymbol{p_2} - \boldsymbol{p_0}}{t_{01} + t_{12}}
    ))
$$

$$
\boldsymbol{m_2}=(1-\tau)
    (\boldsymbol{p_2} - \boldsymbol{p_1} + t_{12} (
      \frac{\boldsymbol{p_3} - \boldsymbol{p_2}}{t_{23}} - \frac{\boldsymbol{p_3} - \boldsymbol{p_1}}{t_{12} + t_{23}}
    ))
$$

$$
\boldsymbol{a}=2(\boldsymbol{p_1}-\boldsymbol{p_2})+\boldsymbol{m_1}+\boldsymbol{m_2} \\
\boldsymbol{b}=-3(\boldsymbol{p_1}-\boldsymbol{p_2})-\boldsymbol{m_1}-\boldsymbol{m_1}-\boldsymbol{m_2} \\
\boldsymbol{c}=\boldsymbol{m_1} \\
\boldsymbol{d}=\boldsymbol{p_1} \\
$$

$$
\boldsymbol{p}(t)=\boldsymbol{a}t^3+\boldsymbol{b}t^2+\boldsymbol{c}t+\boldsymbol{d}
$$

### 弧长

先求导

$$
\boldsymbol{p}^{'}=\frac{d\boldsymbol{p}(t)}{dt}=3t^2\boldsymbol{a}+2t\boldsymbol{b}+\boldsymbol{c}
$$

弧长:

$$
s=\int_0^1 \lvert {\boldsymbol{p}}^{'} \rvert dt
$$

$$
s(t_0, t_1) = \int_{t_0}^{t_1} \lvert {\boldsymbol{p}}^{'} \rvert dt = (t_1-t_0) \int_0^1 \lvert {\boldsymbol{p}}^{'}(x(t_1-t_0)+t_0)\rvert dx
$$

其中

$$
x = \frac{t-t_0}{t_1-t_0}
$$
